Эта функция может определить какому классу принадлежит объект в памяти компьютера. То есть уже сужествующий. Для пользования этой функцией в определении класса должны в объявлении и реализации класса должны быть макроопределения.
DECLARE_DYNAMIC IMPLEMENT_DYNAMIC
В противном случае при компиляции будут выдаваться ошибки типа:
E:\PROJECT\TestObject\TestObject.cpp(29) : error C2039: 'classCMyObject' : is not a member of 'CMyObject'
E:\PROJECT\TestObject\TestObject.cpp(8) : see declaration of 'CMyObject'
Давайте посмотрим ее определение:
BOOL IsKindOf ( const CRuntimeClass* pClass // Указатель на струтуру CRuntimeClass ) const;
Функция вернет ненулевое значение, если объект соотвествует классу или 0 при несоответствии. Давайте посмотрим пример.
// TestObject.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"
class CMyObject : public CObject
{
protected:
DECLARE_DYNAMIC(CMyObject)
};
IMPLEMENT_DYNAMIC(CMyObject,CObject);
class CAlternativeObject : public CObject
{
protected:
DECLARE_DYNAMIC(CAlternativeObject)
};
IMPLEMENT_DYNAMIC(CAlternativeObject,CObject);
void main()
{
CMyObject* myObj = new CMyObject;
if (myObj->IsKindOf(RUNTIME_CLASS(CMyObject)))
cout << "CMyObject Test 1" << endl;
else
cout << "Not CMyObject Test 1" << endl;
if (myObj->IsKindOf(RUNTIME_CLASS(CAlternativeObject)))
cout << "CMyObject Test 2" << endl;
else
cout << "Not CMyObject Test2" << endl;
}
Мы имеем два класса и с помошью функции IsKindOf проверяем какому классу принадлежит объект. Зачем это нужно ??? Ну, например, чтобы узнать есть ли нужная функция в классе. Вы скажете, что знаете, так как сами пишите программу. Представьте, что у Вас есть набор классов в массиве. Как вы разберетесь какой указатель на какой показывает ??? Ну естественно создадите в классе поле Identify. Чтобы этого не делать и реализована эта функция.